import altair as altimport pandas as pddf = pd.read_csv("datos.csv")# Convertir fechas, fechas inválidas se vuelven NaTdf['eventDate'] = pd.to_datetime(df['eventDate'], errors='coerce')# Eliminar filas con fechas inválidas (NaT)df = df.dropna(subset=['eventDate'])print(df.head())
institutionCode collectionCode ownerInstitutionCode basisOfRecord \
0 INABIOEC MECN-QCNE INABIO PreservedSpecimen
1 INABIOEC MECN-QCNE INABIO PreservedSpecimen
2 INABIOEC MECN-QCNE INABIO PreservedSpecimen
3 INABIOEC MECN-QCNE INABIO PreservedSpecimen
4 INABIOEC MECN-QCNE INABIO PreservedSpecimen
catalogNumber family scientificName scientificNameAuthorship \
0 259958 Agaricaceae Agaricaceae Chevall.
1 259959 Clavariaceae Ramaria Por definir
2 259960 Sarcoscyphaceae Cookeina speciosa (Fr.) Dennis
3 259961 Agaricaceae Cyathus Por definir
4 260015 Polyporaceae Polyporaceae Fr. ex Corda
recordedBy recordNumber eventDate country stateProvince
0 Rosa Batallas 2820 2022-03-23 Ecuador Sucumbíos
1 Rosa Batallas 2821 2022-03-23 Ecuador Sucumbíos
2 Rosa Batallas 2823 2022-03-23 Ecuador Sucumbíos
3 Rosa Batallas 2824 2022-03-23 Ecuador Sucumbíos
4 Rosa Batallas 2826 2022-03-23 Ecuador Sucumbíos
Visualización de registros por familia (gráfico de barras)
Code
alt.Chart(df).mark_bar().encode( x=alt.X('count()', title='Número de registros'), y=alt.Y('family:N', sort='-x', title='Familia'), tooltip=['family', 'count()']).properties( title='Número de registros por familia', width=400, height=300)
Distribución temporal de registros (gráfico de líneas)
Code
df['eventDate'] = pd.to_datetime(df['eventDate'])alt.Chart(df).mark_line(point=True).encode( x=alt.X('yearmonth(eventDate):T', title='Fecha'), y=alt.Y('count()', title='Número de registros'), tooltip=['yearmonth(eventDate):T', 'count()']).properties( title='Registros por fecha', width=500).interactive()
Gráfico de dispersión: Número de colecta vs. Número de catálogo
Code
alt.Chart(df).mark_circle(size=100).encode( x='recordNumber:N', y='catalogNumber:Q', color='family:N', tooltip=['recordNumber', 'catalogNumber', 'family', 'scientificName']).properties( title='Relación entre número de colecta y número de catálogo', width=500, height=300).interactive()
Cantidad de especies provincia (gráfico de barras apiladas)
Code
alt.Chart(df).mark_bar().encode( x=alt.X('count()', title='Número de registros'), y=alt.Y('stateProvince:N', title='Provincia'), color='country:N', tooltip=['country', 'stateProvince', 'count()']).properties( title='Registros por país y provincia', width=400, height=300)